#!/usr/bin/env python3
"""
专门修复日期格式的脚本
"""

import sys
import os
from datetime import datetime

# 添加项目根目录到 Python 路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from models.database import DatabaseManager
from config.settings import settings


def fix_all_date_formats():
    """修复所有日期格式问题"""
    print("🔧 开始修复所有日期格式问题...")
    
    try:
        db_manager = DatabaseManager(settings.get_database_path())
        
        # 获取所有有截止日期的任务
        query = "SELECT id, due_date FROM tasks WHERE due_date IS NOT NULL"
        tasks = db_manager.execute_query(query)
        
        print(f"📊 找到 {len(tasks)} 个任务需要检查日期格式")
        
        fixed_count = 0
        for task in tasks:
            task_id = task['id']
            due_date = task['due_date']
            
            print(f"  检查任务 {task_id}: {due_date}")
            
            # 尝试解析并标准化日期
            standardized_date = standardize_date(due_date)
            
            if standardized_date and standardized_date != due_date:
                # 更新数据库
                update_result = db_manager.execute_update(
                    "UPDATE tasks SET due_date = ? WHERE id = ?",
                    (standardized_date, task_id)
                )
                
                if update_result > 0:
                    print(f"  ✅ 修复任务 {task_id}: {due_date} -> {standardized_date}")
                    fixed_count += 1
                else:
                    print(f"  ❌ 更新失败: 任务 {task_id}")
            elif standardized_date:
                print(f"  ✓ 任务 {task_id} 日期格式正确")
            else:
                print(f"  ⚠️ 任务 {task_id} 日期格式无法解析: {due_date}")
        
        print(f"\n🎉 修复完成！共修复 {fixed_count} 个日期字段")
        
        # 验证修复结果
        print("\n🔍 验证修复结果...")
        verify_dates(db_manager)
        
    except Exception as e:
        print(f"❌ 修复失败: {e}")


def standardize_date(date_str):
    """标准化日期格式为 YYYY-MM-DD"""
    if not date_str:
        return None
    
    # 尝试各种日期格式
    formats_to_try = [
        '%Y-%m-%d',                    # 2024-12-31
        '%Y-%m-%d %H:%M:%S.%f',       # 2025-08-01 10:31:00.384973
        '%Y-%m-%d %H:%M:%S',          # 2025-08-01 10:31:00
        '%Y-%m-%dT%H:%M:%S.%f',       # ISO format with microseconds
        '%Y-%m-%dT%H:%M:%S',          # ISO format
        '%Y/%m/%d',                   # 2024/12/31
        '%m/%d/%Y',                   # 12/31/2024
        '%d/%m/%Y',                   # 31/12/2024
    ]
    
    for fmt in formats_to_try:
        try:
            parsed_date = datetime.strptime(date_str, fmt)
            # 返回标准化的日期格式 (只保留日期部分)
            return parsed_date.date().strftime('%Y-%m-%d')
        except ValueError:
            continue
    
    # 如果所有格式都失败，尝试只提取日期部分
    try:
        # 如果包含空格，只取空格前的部分
        if ' ' in date_str:
            date_part = date_str.split(' ')[0]
            return standardize_date(date_part)
        
        # 如果包含T，只取T前的部分
        if 'T' in date_str:
            date_part = date_str.split('T')[0]
            return standardize_date(date_part)
            
    except:
        pass
    
    return None


def verify_dates(db_manager):
    """验证所有日期格式是否正确"""
    query = "SELECT id, due_date FROM tasks WHERE due_date IS NOT NULL"
    tasks = db_manager.execute_query(query)
    
    valid_count = 0
    invalid_count = 0
    
    for task in tasks:
        task_id = task['id']
        due_date = task['due_date']
        
        # 检查是否为标准格式 YYYY-MM-DD
        try:
            datetime.strptime(due_date, '%Y-%m-%d')
            valid_count += 1
        except ValueError:
            print(f"  ❌ 任务 {task_id} 日期格式仍然无效: {due_date}")
            invalid_count += 1
    
    print(f"✅ 验证完成: {valid_count} 个有效, {invalid_count} 个无效")
    
    if invalid_count == 0:
        print("🎉 所有日期格式都已修复！")
    else:
        print("⚠️ 仍有部分日期格式需要手动处理")


def main():
    """主函数"""
    print("🔧 日期格式修复工具")
    print("=" * 40)
    
    fix_all_date_formats()
    
    print("\n✅ 修复完成！现在可以重新启动应用程序。")
    return 0


if __name__ == "__main__":
    sys.exit(main())